"use strict";

function doSomething() {
    //启用ES5 严格模式
    "use strict";
    var value1;
    // 严格模式下，不能直接定义全局变量
    // globalValue="global";
    value1 = "hi";
    value1 = 3;
}

function typeofTest() {
    var message = "hi";
    alert("message的类型:" + typeof message);
    alert("95的类型:" + typeof 95);
    alert("null的类型:" + typeof null);
}

function undefinedTest() {
    var message;
    // alert("message==undefined:" + message == undefined);
    // alert(("message==undefined:" + message) == undefined);
    alert("message == undefined:" + (message == undefined));
    message = undefined;
    alert("message = undefined\nmessage == undefined:" + (message == undefined));
    alert("null == undefined:" + (null == undefined));
}

function infinityTest() {
    var result = Number.MAX_VALUE + Number.MAX_VALUE;
    // Number.NEGATIVE_INFINITY 和Number.POSITIVE_INFINITY
    alert("Number.MAX_VALUE + Number.MAX_VALUE:" + result);
    alert("参数位于最小与最大数值之间:" + isFinite(result))
}

function NaNTest() {
    alert(NaN == NaN); //false
    alert(isNaN(NaN)); //true
    alert(isNaN(10)); //false（10 是一个数值）
    alert(isNaN("10")); //false（可以被转换成数值10）
    alert(isNaN("blue")); //true（不能转换成数值）
    alert(isNaN(true)); //false（可以被转换成数值1）
}

function numberTest() {
    var num1 = Number("Hello world!"); //NaN
    var num2 = Number(""); //0
    var num3 = Number("000011"); //11
    var num4 = Number(true); //1
}

function parseIntTest() {
    var num1 = parseInt("1234blue"); // 1234
    var num2 = parseInt(""); // NaN
    var num3 = parseInt("0xA"); // 10（十六进制数）
    var num4 = parseInt(22.5); // 22
    var num5 = parseInt("070"); // 56（八进制数）
    var num6 = parseInt("70"); // 70（十进制数）
    var num7 = parseInt("0xf"); // 15（十六进制数）

    var num0 = parseInt("0xAF", 16); //175
    var num1 = parseInt("AF", 16); //175
    var num2 = parseInt("AF"); //NaN

    var num1 = parseInt("10", 2); //2 （按二进制解析）
    var num2 = parseInt("10", 8); //8 （按八进制解析）
    var num3 = parseInt("10", 10); //10 （按十进制解析）
    var num4 = parseInt("10", 16); //16 （按十六进制解析）
}

function parseFloatTest() {
    var num1 = parseFloat("1234blue"); //1234 （整数）
    var num2 = parseFloat("0xA"); //0
    var num3 = parseFloat("22.5"); //22.5
    var num4 = parseFloat("22.34.5"); //22.34
    var num5 = parseFloat("0908.5"); //908.5
    var num6 = parseFloat("3.125e7"); //31250000
}

function objectTest() {
    var obj1 = new MyObject();
    alert("constructor:" + obj1.constructor);
    alert("constructor.prototype:" + obj1.constructor.prototype);
    alert("obj1.hasOwnProperty(\"name\"):" + obj1.hasOwnProperty("name") + "\nobj1.name:" + obj1.name);
    var obj2 = Object.create(MyObject.prototype, {
        name: {
            value: "aaa"
        }
    });
    alert("constructor:" + obj2.constructor);
    alert("constructor.prototype:" + obj2.constructor.prototype);
    alert("obj2.hasOwnProperty(\"name\"):" + obj2.hasOwnProperty("name") + "\nobj2.name:" + obj2.name);
}

function MyObject() {
    var name;
}

function operTest() {
    var s1 = "2";
    var s2 = "z";
    var b = false;
    var f = 1.1;
    var o = {
        valueOf: function () {
            return -1;
        }
    };
    s1++; // 值变成数值3
    s2++; // 值变成NaN
    b++; // 值变成数值1
    f--; // 值变成0.10000000000000009（由于浮点舍入错误所致）
    o--; // 值变成数值-2

    //按位非（NOT）
    var num1 = 25; // 二进制00000000000000000000000000011001
    var num2 = ~num1; // 二进制11111111111111111111111111100110
    alert(num2); // -26
    //按位与（AND）
    var result = 25 & 3;
    alert(result); //1
    //按位或（OR）
    var result = 25 | 3;
    alert(result); //27
    //按位异或（XOR）
    var result = 25 ^ 3;
    alert(result); //26
    //左移
    var oldValue = 2; // 等于二进制的10
    var newValue = oldValue << 5; // 等于二进制的1000000，十进制的64
    //有符号的右移
    var oldValue = 64; // 等于二进制的1000000
    var newValue = oldValue >> 5; // 等于二进制的10 ，即十进制的2
    //无符号右移
    var oldValue = 64; // 等于二进制的1000000
    var newValue = oldValue >>> 5; // 等于二进制的10 ，即十进制的2
    var oldValue = -64; // 等于二进制的11111111111111111111111111000000
    var newValue = oldValue >>> 5; // 等于十进制的134217726

    var result1 = NaN < 3; //false
    var result2 = NaN >= 3; //false

    var result1 = ("55" == 55); //true，因为转换后相等
    var result2 = ("55" === 55); //false，因为不同的数据类型不相等
}

function forInTest() {
    for (var propName in window) {
        document.write(propName + " ");
    }
}

// function withTest() {
//     var qs = location.search.substring(1);
//     var hostName = location.hostname;
//     var url = location.href;
//     //严格模式无法使用with
//     with (location) {
//         var qs = search.substring(1);
//         var hostName = hostname;
//         var url = href;
//     }
// }

function argumentsTest() {
    //ECMAScript 中的所有参数传递的都是值，不可能通过引用传递参数。
    alert("arguments.length:" + arguments.length);
    alert("arguments[0]:" + arguments[0] + ",arguments[1]:" + arguments[1]);
}



